package com.byx.imclientutil.service;

import com.byx.imclientutil.config.ImProperties;
import com.byx.imclientutil.listener.OnApplicationLayerCallBack;
import com.byx.imclientutil.listener.OnConnectStatusListener;
import com.byx.imclientutil.listener.OnMessageStatusListener;
import com.byx.imclientutil.netty.MessageDispatcher;
import com.byx.imclientutil.protobuf.ChatMessageProtobuf;

/**
 * ImService
 *
 * @author Superb
 * @date 2021/2/9 16:42
 */
public interface ImServiceClient {
    /**
     * 初始化
     * @param imProperties 配置的各种属性
     * @param onConnectStatusListener 网络连接状态监听器
     * @return boolean
     */
    boolean initialize(ImProperties imProperties, OnConnectStatusListener onConnectStatusListener);

    /**
     *  开启连接
     * @param onApplicationLayerCallBack 应用层回调
     */
    void connect(OnApplicationLayerCallBack onApplicationLayerCallBack);

    /**
     * 重连
     * @param isFirstConnect 是否是第一次连接
     */
    void reconnect(boolean isFirstConnect);

    /**
     *
     * @param msg
     */
    void sendMessage(ChatMessageProtobuf.Msg msg);

    /**
     * 获取重连间隔时长
     *
     * @return
     */
    int getReconnectInterval();

    /**
     * 获取连接超时时长
     *
     * @return
     */
    int getConnectTimeout();

    /**
     * 获取应用在前台时心跳间隔时间
     *
     * @return
     */
    int getForegroundHeartbeatInterval();

    /**
     * 获取应用在后台时心跳间隔时间
     *
     * @return
     */
    int getBackgroundHeartbeatInterval();

    /**
     * 设置app前后台状态
     *
     * @param appStatus
     */
    void setAppStatus(int appStatus);

    /**
     * 获取由应用层构造的握手消息
     *
     * @return
     */
    ChatMessageProtobuf.Msg getHandshakeMsg();

    /**
     * 获取由应用层构造的心跳消息
     *
     * @return
     */
    ChatMessageProtobuf.Msg getHeartbeatMsg();

    /**
     * 获取应用层消息发送状态报告消息类型
     *
     * @return
     */
    int getServerSentReportMsgType();

    /**
     * 获取应用层消息接收状态报告消息类型
     *
     * @return
     */
    int getClientReceivedReportMsgType();

    /**
     * 获取应用层消息发送超时重发次数
     *
     * @return
     */
    int getResendCount();

    /**
     * 获取应用层消息发送超时重发间隔
     *
     * @return
     */
    int getResendInterval();

    /**
     * 获取消息转发器
     *
     * @return
     */
    MessageDispatcher getMsgDispatcher();

    /**
     * 绑定消息状态监听器
     * @param onMessageStatusListener 消息状态监听
     */
    void bindOnMessageStatusListener(OnMessageStatusListener onMessageStatusListener);
//
//    /**
//     * 获取消息发送超时定时器
//     *
//     * @return
//     */
//    MsgTimeoutTimerManager getMsgTimeoutTimerManager();

    /**
     * 标识ims是否已关闭
     *
     * @return
     */
    boolean isClosed();

    /**
     * 关闭服务，释放资源
     */
    void release();
}
